package com.jade.bss.admin.account;

import java.util.List;

import com.jade.bss.admin.AdminException;
import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;

/**
 * 管理账号管理器。
 *
 * @author sky
 * @version 1.0 13-4-18 上午10:40
 */
public interface AdminAccountManager
{
    /**
     * 增加一个管理员
     *
     * @param admin 管理员对象
     * @return 管理员标识
     * @throws AdminException 处理异常
     */
    public int addAdmin(AdminAccount admin)
            throws AdminException;

    /**
     * 增加一个管理员,并且赋予角色
     *
     * @param admin   管理员对象
     * @param roleIds 管理员所属的角色
     * @return 管理员标识
     * @throws AdminException 处理异常
     */
    public int addAdmin(AdminAccount admin, int[] roleIds)
            throws AdminException;

    /**
     * 批量删除admin
     *
     * @param ids admin标识数组
     * @throws AdminException 异常
     */
    public void removeAdmin(int... ids)
            throws AdminException;

    /**
     * 根据标识返回这个对象
     *
     * @param id 对象标识id
     * @return 对象
     */
    public AdminAccount getAdmin(int id);

    /**
     * 根据类型和名称获取管理员，如果允许不同的所有者拥有相同的名称，那么将采用默认的所有者。
     *
     * @param type 管理着类型
     * @param name      对象标识id
     * @return 对象
     */
    public AdminAccount getAdmin(String type, String name);

    /**
     * 根据类型、所有者、名称获取管理员。
     *
     * @param type 管理着类型
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @param name      对象标识id
     * @return 对象
     */
    public AdminAccount getAdmin(String type, String ownerType, String ownerId, String name);

    /**
     * 校验管理员。缺省的类型和所有者。
     *
     * @param name     管理员名称
     * @param password 管理员密码
     * @return 管理员对象
     * @throws AdminException 管理员不存在；密码错误等等
     */
    public AdminAccount validateAdmin(String name, String password)
            throws AdminException;

    /**
     * 校验管理员。
     *
     * @param type 管理着类型
     * @param name      管理员名称
     * @param name      管理员名称
     * @param password  管理员密码
     * @return 管理员对象
     * @throws AdminException 管理员不存在；密码错误等等
     */
    public AdminAccount validateAdmin(String type, String name, String password)
            throws AdminException;

    /**
     * 校验管理员。
     *
     * @param type 管理着类型
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @param name      管理员名称
     * @param password  管理员密码
     * @return 管理员对象
     * @throws AdminException 管理员不存在；密码错误等等
     */
    public AdminAccount validateAdmin(String type, String ownerType, String ownerId, String name, String password)
            throws AdminException;

    /**
     * 根据条件返回对象列表
     *
     * @param criteria 包含的条件
     * @param offset   偏移量
     * @param length   列表长度
     * @return 管理员列表
     * @deprecated replaced by queryAdmin(Criteria criteria)
     */
    public PagingList<AdminAccount> queryAdmin(Criteria criteria, int offset, int length);

    /**
     * 根据条件返回对象列表
     *
     * @param criteria 包含的条件
     * @return 管理员列表
     */
    public PagingList<AdminAccount> queryAdmin(Criteria criteria);

    /**
     * 查询一个所有者下面的所有管理员信息。
     *
     * @param type 管理着类型
     * @param ownerType 管理者类型
     * @param ownerId   管理员标识
     * @param offset    偏移量
     * @param length    列表长度
     * @return 管理员列表
     */
    public PagingList<AdminAccount> queryAdmin(String type, String ownerType, String ownerId, int offset, int length);

    /**
     * 根据条件列出管理员账号信息。
     *
     * @param criteria 查询条件
     * @return 管理员账号信息列表
     */
    public List<AdminAccount> listAdmin(Criteria criteria);

    /**
     * 根据条件列出管理员账号信息。
     *
     * @param type 管理着类型
     * @param ownerType 管理者类型
     * @param ownerId   管理员标识
     * @return 管理员账号信息列表
     */
    public List<AdminAccount> listAdmin(String type, String ownerType, String ownerId);

    /**
     * 修改对象信息
     *
     * @param admin 被修改对象
     * @throws AdminException 处理异常
     */
    public void updateAdmin(AdminAccount admin)
            throws AdminException;

    /**
     * 修改客户密码（根据id,需要校验旧密码）
     *
     * @param id          admin标识
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @throws AdminException 异常 客户不存在/旧密码不正确
     */
    public void modifyPassword(int id, String oldPassword, String newPassword)
            throws AdminException;

    /**
     * 重置客户密码（根据id,不需要校验旧密码）
     *
     * @param id          客户标识
     * @param newPassword 新密码
     * @throws AdminException 异常
     */
    public void resetPassword(int id, String newPassword)
            throws AdminException;

    /**
     * 更改管理员状态
     *
     * @param status 新的状态
     * @param ids    admin标识
     * @throws AdminException 管理员不存在
     */
    public void updateStatus(int status, int... ids)
            throws AdminException;

}
